////////////////////////////////////////////////////////////////////////////////

#ifndef _PHYSICALTYPES_H_
#define _PHYSICALTYPES_H_

////////////////////////////////////////////////////////////////////////////////

#include <vector>

////////////////////////////////////////////////////////////////////////////////


/** Physical engine namespace */
namespace PE
{
////////////////////////////////////////////////////////////////////////////////
// Utility types
////////////////////////////////////////////////////////////////////////////////


    /** Minimal precision */
    const double _E = 0.000000001;


    /** [PE utility type]: 2-dimensional vector type */
    struct Vector
    {
        Vector operator-() const
        {
            Vector vec = {-vx, -vy};
            return vec;
        }

        double vx;
        double vy;
    };


    /** [PE utility type]: 2-dimensional point type */
    struct Point
    {
        Point(double _x = 0, double _y = 0) : x(_x), y(_y) {}

        bool operator== (const Point& _pt)
        {
            return _pt.x == x && _pt.y == y;
        }

        Point operator+ (const Point& _pt) const
        {
            Point pt;
            pt.x = x + _pt.x;
            pt.y = y + _pt.y;
            return pt;
        }

        double x;
        double y;
    };


    /** [PE utility type]: direction (unit vector) */
    typedef struct
    {
        double dx;
        double dy;
    } Direction;


    /** [PE utility type]: Line, contains start point and end point */
    struct Line
    {
        Point pS;
        Point pE;
    };


    /** [PE utility type]: vector of points */
    typedef std::vector<Point> Points;


////////////////////////////////////////////////////////////////////////////////

};

////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
